package com.kyjszj.modules.spider;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static java.util.regex.Pattern.*;

public class SpiderUtils {
    /* private static String respond; */

    /**
     *
     * @param Url
     * @return 爬虫结果类 SpiderFruit
     * @return Content 页面下载方法
     */

    // 模拟出真实的HTTP交互并获取图片
    /*
     * 1.设置请求对象 User-Agnet httpGet.setHeader("User-Agent",
     * "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0"
     * );
     *
     * 2.获取响应内容类型 Content-Type HttpEntity entity = respond.getEntity();
     * System.out.println(entity.getContentType().getValue());
     *
     * 3.获取响应状态码 Status
     *
     * 200:正常 403:拒绝 500:服务器报错 400:未找到页面
     *
     * CloseableHttpResponse respond = httpclient.execute(httpGet);
     * System.out.println(respond.getStatusLine().getStatusCode());
     *
     * 4.复制资源： commons io 2.5 _Jar : 复制网络中的资源
     *
     * 5.设置高匿IP 参考网站:http://www.xicidaili.com/nn/ HttpHost proxy=new
     * HttpHost("175.155.213.235", 9999); RequestConfig
     * config=RequestConfig.custom().setProxy(proxy).build();
     * httpGet.setConfig(config);
     *
     * 6.设置连接超时,自动断连接,不会让程序一直连; RequestConfig config =
     * RequestConfig.custom().setConnectTimeout(10000)// 设置连接时间超时10秒
     * .setSocketTimeout(1000)// 设置读取时间超时10秒 .build(); httpGet.setConfig(config);
     */

    // 传入的有代理IP就用代理IP
    public  static SpiderFruit getPageContent(String Url, String IP, Integer port) throws IOException {

        // 创建可关闭的HttpClient实例对象(新版本才可以)相当于创建了一个模拟浏览器
        CloseableHttpClient httpclient = HttpClients.createDefault();

        // 一般爬虫请求都用Get，Get请求在HTTP请求协议里代表安全的查看:这个请求对象里可以添加http的请求头等
        HttpGet httpGet = new HttpGet(Url);

        // 设置超时断连

        RequestConfig configDL = RequestConfig.custom().setConnectTimeout(10000)// 设置连接时间超时10秒断连
                .setSocketTimeout(10000)// 设置读取时间超时10秒断连
                .build();

        // 设置高匿IP
        HttpHost proxy = new HttpHost(IP, port);
        RequestConfig configIP = RequestConfig.custom().setProxy(proxy).build();

        // 添加请求配置

        httpGet.setConfig(configDL);
        httpGet.setConfig(configIP);

        // 设置Get请求头的 User-Agent (模拟代理浏览器信息)
        httpGet.setHeader("User-Agent",
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0");

        // 用浏览器模拟对象httpClient，发送一个Get请求:可以通过这个响应对象获得很多http的响应信息
        CloseableHttpResponse respond = httpclient.execute(httpGet);

        //置空对象,提高速度
        httpGet=null;
        // 封装成一个爬虫结果类
        SpiderFruit SpiderFruit = new SpiderFruit();

        /*
         * // 获得状态码 SpiderFruit.setStatusCode(respond.getStatusLine().getStatusCode());
         *
         * // 获取返回的网页实体 HttpEntity entity = respond.getEntity(); if (entity != null) {
         * // 设置响应内容类型 SpiderFruit.setContentType(entity.getContentType().getValue()); }
         *
         * // 设置网页实体对象转换为字符串，并指定最终编码
         * SpiderFruit.setEntitystr(EntityUtils.toString(entity, "utf-8"));
         */

        // 关闭流资源
        httpclient.close();
        // 关闭流资源
        respond.close();
        return SpiderFruit;
    }

    // 如果传入的是URl则用原有的IP
    public static SpiderFruit getPageContent(String Url) throws IOException {

        // 创建可关闭的HttpClient实例对象(新版本才可以)相当于创建了一个模拟浏览器
        CloseableHttpClient httpclient = HttpClients.createDefault();

        // 一般爬虫请求都用Get，Get请求在HTTP请求协议里代表安全的查看:这个请求对象里可以添加http的请求头等
        HttpGet httpGet = new HttpGet(Url);

        // 设置高匿IP
        /*		HttpHost proxy = new HttpHost("220.174.132.205",8888);
                RequestConfig configIP = RequestConfig.custom().setProxy(proxy).build();
        httpGet.setConfig(configIP);*/
        // 设置超时断连
        RequestConfig configDL = RequestConfig.custom().setConnectTimeout(10000)// 设置连接时间超时10秒断连
                .setSocketTimeout(10000)// 设置读取时间超时10秒断连
                .build();

        // 添加请求配置
        httpGet.setConfig(configDL);


        // 设置Get请求头的 User-Agent (模拟代理浏览器信息)
        httpGet.setHeader("User-Agent",
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0");

        // 用浏览器模拟对象httpClient，发送一个Get请求:可以通过这个响应对象获得很多http的响应信息
        CloseableHttpResponse respond = httpclient.execute(httpGet);

        //置空对象节省资源
        httpGet=null;

        // 封装成一个爬虫结果类
        SpiderFruit SpiderFruit = new SpiderFruit();

        // 获得状态码
        SpiderFruit.setStatusCode(respond.getStatusLine().getStatusCode());

        // 获取返回的网页实体
        HttpEntity entity = respond.getEntity();
        if (entity != null) {
            // 设置响应内容类型
            SpiderFruit.setContentType(entity.getContentType().getValue());
        }

        // 设置网页实体对象转换为字符串，并指定最终编码
        SpiderFruit.setEntitystr(EntityUtils.toString(entity, "utf-8"));

        // 关闭流资源
        httpclient.close();
        // 关闭流资源
        respond.close();
        return SpiderFruit;
    }

    public static String getDescrtion(String numId) throws IOException {
        String url="http://hws.m.taobao.com/cache/wdesc/5.0/?id="+numId;
        SpiderFruit SpiderFruit =getPageContent(url);
        if(200!=SpiderFruit.getStatusCode()){
            SpiderFruit=getPageContent(url);
        }
        String result=SpiderFruit.getEntitystr();
        Pattern pattern = compile("<p[^>]*>(?:(?!<\\/p>)[\\s\\S])*<\\/p>");
        Matcher matcher = pattern.matcher(result);
        if(matcher.find()) {
            return matcher.group()+"";
        }
        return "";
    }
  public static void main(String []args) throws IOException {
      System.out.println( SpiderUtils.getDescrtion("527227835390"));
  }
}
